﻿using ConfExpert.Datasets;
using ConfExpert.Forms.Base;
using ConfExpert.Utility;
using DevExpress.XtraBars;
using DevExpress.XtraEditors;
using DevExpress.XtraEditors.Controls;
using DevExpress.XtraEditors.Repository;
using DevExpress.XtraGrid.Views.Grid;
using DevExpress.XtraReports.UI;
using DevTeam;
using Org.LLRP.LTK.LLRPV1.Impinj;
using System;
using System.Collections.Generic;
using System.Data;
using System.Drawing;
using System.Threading;
using System.Windows.Forms;

namespace ConfExpert.Forms.Depo.Cikis
{
    public partial class CikisFormu : XRFID
    {
        DataTable dtTanimsiz;

        bool isHandleDestroyed = false;
        DateTime Tarih = new DateTime(2000, 1, 1);
        BindingSource bsCikis, bsCikisLines, bsT;
        public System.Timers.Timer timerDk = null;
        public System.Timers.Timer timerSn = null;
        private int AtelyeId { get; set; }

        List<int> tags = new List<int>();

        delegate void DkHandler();
        delegate void SnHandler();

        public CikisFormu()
        {
            InitializeComponent();
        }

        int SelectedShelfId = 0;
        private void Cikis_Load(object sender, EventArgs e)
        {
            gleShelf.Visibility = ytk(94) ? BarItemVisibility.Always : BarItemVisibility.Never;
            gleShelf.Edit.Assign(RI(Rp.Shelf));
            gleShelf.EditValueChanged += gleShelf_EditValueChanged;


            dtTanimsiz = new DataTable("Tanimsiz");
            DataColumn cTarih = new DataColumn("Tarih", typeof(DateTime));
            DataColumn cEpc = new DataColumn("EPC", typeof(string));
            dtTanimsiz.Columns.AddRange(new DataColumn[] {
                cTarih, cEpc
            });
            bsT = new BindingSource(dtTanimsiz, string.Empty);
            InitGridView(gvTanimsiz, bsT);

            backgroundWorker1.DoWork += backgroundWorker1_DoWork;
            backgroundWorker1.RunWorkerCompleted += backgroundWorker1_RunWorkerCompleted;
            //backgroundWorker1.RunWorkerAsync();

            backgroundWorkerSiren.DoWork += backgroundWorkerSiren_DoWork;

            ds.xCikis2.Columns.Add("CikilanQty", typeof(decimal), "IIF(IsNull(Iptal, 0) = 0 AND (IsNull(Durum, '') = 'Fazla' OR IsNull(Durum, '') = 'OK'), IsNull(Qty, 0), 0)");
            ds.xCikis2.Columns.Add("CikilanAdet", typeof(decimal), "IIF(IsNull(Iptal, 0) = 0 AND (IsNull(Durum, '') = 'Fazla' OR IsNull(Durum, '') = 'OK'), 1, 0)");
            ds.xCikis2.Columns.Add("E", typeof(int), "IIF(IsNull(Iptal, 0) = 0 AND IsNull(Durum, '') = 'Eksik', 1, 0)");
            ds.xCikis2.Columns.Add("F", typeof(int), "IIF(IsNull(Iptal, 0) = 0 AND IsNull(Durum, '') = 'Fazla', 1, 0)");
            ds.xCikis2.Columns.Add("O", typeof(int), "IIF(IsNull(Iptal, 0) = 0 AND IsNull(Durum, '') = 'OK', 1, 0)");
            ds.xCikis2.Columns.Add("I", typeof(int), "IIF(IsNull(Iptal, 0) = 1, 1, 0)");
            //ds.xCikis2.Columns.Add("BolunenTopId", typeof(int));
            ds.xCikis2.Columns.Add("CEGTS", typeof(int), "IIF(IsNull(CikisEmriId,0)>0,1,0)");
            ds.xCikis2.Columns.Add("RollCut", typeof(int), "IIF(IsNull(BolunenTopId,0)>0,1,0)");

            ds.xCikis1.Columns.Add("CikilanQty", typeof(decimal), "SUM(Child(FK_xCikis2_xCikis1_ProductId).CikilanQty)");
            ds.xCikis1.Columns.Add("CikilanAdet", typeof(int), "SUM(Child(FK_xCikis2_xCikis1_ProductId).CikilanAdet)");
            ds.xCikis1.Columns.Add("E", typeof(int), "SUM(Child(FK_xCikis2_xCikis1_ProductId).E)");
            ds.xCikis1.Columns.Add("F", typeof(int), "SUM(Child(FK_xCikis2_xCikis1_ProductId).F)");
            ds.xCikis1.Columns.Add("O", typeof(int), "SUM(Child(FK_xCikis2_xCikis1_ProductId).O)");
            ds.xCikis1.Columns.Add("I", typeof(int), "SUM(Child(FK_xCikis2_xCikis1_ProductId).I)");
            ds.xCikis1.Columns.Add("CEGTS", typeof(int), "SUM(Child(FK_xCikis2_xCikis1_ProductId).CEGTS)");
            ds.xCikis1.Columns.Add("RollCut", typeof(int), "SUM(Child(FK_xCikis2_xCikis1_ProductId).RollCut)");
            ds.xCikis1.Columns.Add("KumasId", typeof(int), "IIF(StokTipiId = 1, ProductId, null)");
            ds.xCikis1.Columns.Add("TelaId", typeof(int), "IIF(StokTipiId = 8, ProductId, null)");

            bsCikis = new BindingSource(ds, "xCikis1");
            InitGridView(gvCikis, bsCikis);
            gvCikis.FormatAsNumber(0, "E", "F", "O", "I");
            gvCikis.Columns["E"].ToolTip = "Eksik";
            gvCikis.Columns["F"].ToolTip = "Fazla";
            gvCikis.Columns["O"].ToolTip = "OK";
            gvCikis.Columns["I"].ToolTip = "İptal";

            bsCikisLines = new BindingSource(bsCikis, "FK_xCikis2_xCikis1_ProductId");
            InitGridView(gvCikisLines, bsCikisLines);
            gvCikis.OptionsBehavior.Editable =
            gvCikisLines.OptionsBehavior.Editable = false;

            PrepareImageComboBoxEdit(gvCikisLines, "Durum", "Eksik|Fazla|OK");

            gvCikis.AddSummary("HedefQty", "CikilanQty", "CikilanAdet", "E", "F", "O", "I");
            gvCikisLines.AddSummary("Qty");

            gvCikis.MakeColumnInvisible("StokTipiId", "ProductId", "CEGTS", "RollCut");
            gvCikisLines.MakeColumnInvisible("BolunenTopId");


            gvCikis.Columns["TelaId"].VisibleIndex = 1;
            gvCikis.Columns["KumasId"].VisibleIndex = 1;

            gvCikisLines.MakeColumnInvisible("ProductId", "Scan", "E", "F", "O", "I", "CikilanQty", "CikilanAdet", "CEGTS", "RollCut");
            DisableEvenOddROw();

            GridManager gm = GridManager.GetManager(gvCikisLines);
            gm.GridMenu.AddMenu("İptalEt/GeriAl", GeriAl);

            timerDk = new System.Timers.Timer(60e3); //Dakikada bir top tablosunu yenile!
            timerDk.SynchronizingObject = this;
            timerDk.Elapsed += new System.Timers.ElapsedEventHandler(raiseDk);
            timerDk.Enabled = true;

            timerSn = new System.Timers.Timer(250); //her saniyede kontrol et ve bekleyen kayıt varsa gride dök
            timerSn.SynchronizingObject = this;
            timerSn.Elapsed += new System.Timers.ElapsedEventHandler(raiseSn);
            timerSn.Enabled = true;

            this.HandleDestroyed += new EventHandler(Cikis_HandleDestroyed);

            GetDetails("xTarih;xToplar", "GetRolls", Tarih);
            Tarih = ds.xTarih[0].Tarih;
            gvCikis.RowStyle += gvCikis_RowStyle;
            gvCikisLines.RowStyle += gvCikisLines_RowStyle;
            btnBarkod.ItemClick += btnBarkod_ItemClick;
            btnIrsaliye.ItemClick += btnIrsaliye_ItemClick;
            btnIptal.ItemClick += btnIptal_ItemClick;
            btnCikisEmriSec.ItemClick += btnCikisEmriSec_ItemClick;
            btnGuncelle.ItemClick += btnGuncelle_ItemClick;

            Reset();

            //gvCikis.customCustomRowCellEdit += new CustomRowCellEditEventHandler(gvCikis_CustomRowCellEdit);
        }

        void btnGuncelle_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            DataTable t = ExecuteDataTable("GetBolunenTop");
            foreach (DataRow r in t.Rows)
            {
                if (ds.xCikis2.FindByRollId(r[0].ToInt()) != null)
                    ds.xCikis2.FindByRollId(r[0].ToInt()).SetBolunenTopIdNull();

                if (ds.xToplar.FindByRollId(r[0].ToInt()) != null)
                    ds.xToplar.FindByRollId(r[0].ToInt()).SetBolunenTopIdNull();
            }
        }

        void gleShelf_EditValueChanged(object sender, EventArgs e)
        {
            SelectedShelfId = intParse(gleShelf.EditValue);
        }

        void EnableEvenOddROw()
        {
            gvCikis.OptionsView.EnableAppearanceEvenRow = true;
            //gvCikis.OptionsView.EnableAppearanceOddRow = true;
            gvCikisLines.OptionsView.EnableAppearanceEvenRow = true;
            gvCikisLines.OptionsView.EnableAppearanceOddRow = true;
        }

        void DisableEvenOddROw()
        {
            gvCikis.OptionsView.EnableAppearanceEvenRow = false;
            gvCikis.OptionsView.EnableAppearanceOddRow = false;
            gvCikisLines.OptionsView.EnableAppearanceEvenRow = false;
            gvCikisLines.OptionsView.EnableAppearanceOddRow = false;
            //gvCikis.RefreshData();
            //gvCikisLines.RefreshData();
        }

        void gvCikisLines_RowStyle(object sender, RowStyleEventArgs e)
        {
            GridView view = sender as GridView;

            int CikisEmri = intParse(view.GetRowCellValue(e.RowHandle, "CikisEmriId"));
            int BolunenTop = intParse(view.GetRowCellValue(e.RowHandle, "BolunenTopId"));
            if (CikisEmri > 0 && (CEs == null || CEs == ""))
            {
                e.Appearance.BackColor = Color.LightPink;
            }
            if (BolunenTop > 0)
            {
                e.Appearance.BackColor = Color.LightBlue;
            }
        }

        void gvCikis_RowStyle(object sender, RowStyleEventArgs e)
        {
            GridView view = sender as GridView;

            int CikisEmri = intParse(view.GetRowCellValue(e.RowHandle, "CEGTS"));
            int BolunenTop = intParse(view.GetRowCellValue(e.RowHandle, "RollCut"));
            if (CikisEmri > 0 && (CEs == null || CEs == ""))
            {
                e.Appearance.BackColor = Color.LightPink;
            }
            if (BolunenTop > 0)
            {
                e.Appearance.BackColor = Color.LightBlue;
            }
        }


        void btnIrsaliye_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            if (CEs.ToStr() == "")
            {
                ShowErrorMessage("Çıkış emri seçin !");
                return;
            }
            if (ds.xCikis2.Select("ISNULL(Iptal,0)=0 and (F=1 or O=1)").Length == 0)
            {
                ShowErrorMessage("Lütfen kapıdan top geçirin veya barkodla top okutun !");
                return;
            }
            if (ds.xCikis2.Select("ISNULL(Iptal,0)=0 and F=1").Length > 0)
            {
                ShowErrorMessage("Çıkış emrinde geçmeyen toplar çıkılamaz. Fazla topları iptal edin.");
                return;
            }
            //if ((CEs == null || CEs == string.Empty || CEs == "") && ds.xCikis2.Select("CikisEmriId is not null and ISNULL(Iptal,0)=0").Length > 0)
            //{
            //    ShowErrorMessage("Kapıdan geçen toplar arasında çıkış emrine bağlı top(lar) var.\n- Eğer bir çıkış emrini çıkmak istiyorsanız önce çıkış emrini seçin.\n- Eğer çıkış emirlerinden ayrı bir çıkış yapmak istiyorsanız kırmızı ile işaretli topları çıkmayın !");
            //    return;
            //}

            if (ds.xCikis2.Select("BolunenTopId is not null and ISNULL(Iptal,0)=0 and (F=1 or O =1)").Length > 0)
            {
                ShowErrorMessage("Kapıdan geçen toplar arasında bölünmesi gereken top(lar) var.\nMavi işaretli top/toplar eğer \n- bölünmüş ise, top bölme formundan ilgili topu bölündü olarak işaretleyin.\n " +
                "\n- bölünmemiş ise top bölme işlemini gerçekleştirin !");
                return;
            }

            //int adet = ds.xCikis2.Select("ISNULL(Iptal,0)=0 and F=1 and OrderRef is not null").Length;
            //if (adet > 0)
            //{
            //    ShowErrorMessage("Eklediğiniz topların " + adet.ToString() + " tanesinde OrderRef alanı dolu.\nBu toplar, bir çıkış emri olmadan çıkılamaz. ");
            //    return;
            //}
            if ((AtelyeId == 5 || AtelyeId == 160))//Eğer çıkış yeni depodan karbele olacaksa irsaliye kesilmeyecek
            {
                if (XtraMessageBox.Show("Karbel çıkışı olduğundan irsaliye görüntülenmeyecektir. Çıkışa devam etmek istiyor musunuz?", "Confirm", MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.Yes)
                {
                    int IrsaliyeId = ExecuteScalar("UpdIrsaliyesizCikisByCikisEmriId", CEs, WhoAmI, ds.xCikis2.Serialize()).ToInt();

                    Rapor.xrIrsaliye irsDetay = new Rapor.xrIrsaliye(IrsaliyeId, 0);
                    irsDetay.ShowPreview();

                    Reset();
                }
            }
            else if (Check())
            {
                ExecuteNonQuery("UpdCikis", CEs, WhoAmI, ds.xCikis2.Serialize());

                using (KumasIrsaliyeOlustur ki = new KumasIrsaliyeOlustur(CEs))
                    ki.ShowDialog();

                Reset();
            }

        }

        void btnBarkod_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            AppSession.MainForm.ShowMdiChildForm(typeof(BarkodEkle));

            string RollIds = AppSession.BarkodEkle;
            if (RollIds.Length > 1)
            {
                foreach (string str in RollIds.Split(",".ToCharArray()))
                    if (intParse(str) > 0)
                        AddToCikis(intParse(str /*Message.Substring(0, Message.Length - 1)*/));   //parity biti atıyoruz!

                gvCikis.BestFitColumns();
            }
        }

        void GeriAl(object sender, EventArgs e)
        {
            foreach (int handle in gvCikisLines.GetSelectedRows())
            {
                int epc = intParse(gvCikisLines.GetRowCellValue(handle, "RollId"));
                //int epc = intParse(bsCikisLines, "RollId");

                MyData.xCikis2Row c2 = ds.xCikis2.FindByRollId(epc);
                if (c2 != null)
                    if (c2.IsIptalNull())
                        c2.Iptal = true;
                    else
                        c2.Iptal = !c2.Iptal;

            }
            gvCikisLines.RefreshData();
        }

        void backgroundWorker1_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
        {
            if (e.Result != null)
                if ((e.Result as DataSet).Tables[0].Rows[0]["Tarih"] != DBNull.Value)
                {
                    Tarih = (DateTime)((e.Result as DataSet).Tables[0].Rows[0]["Tarih"]);
                    ds.xToplar.Merge((e.Result as DataSet).Tables[1]);

                    if ((e.Result as DataSet).Tables[1].Rows.Count > 0)
                        AppSession.MainForm.NotifyMain((e.Result as DataSet).Tables[1].Rows.Count.ToString() + " top kaydı alındı.");
                }
        }

        void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
        {
            e.Result = Session.DataManager.ExecuteDataSet("GetRolls", Tarih);     //dsNew;
        }

        public void RefreshTop()
        {
            if (!backgroundWorker1.IsBusy)
                backgroundWorker1.RunWorkerAsync();
        }

        void backgroundWorkerSiren_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
        {
            Set_GPO_State(4, true);
            Thread.Sleep(3000);
            Set_GPO_State(4, false);
        }

        void btnCikisEmriSec_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            using (CikisEmirleriSec ce = new CikisEmirleriSec())
            {
                if (ce.ShowDialog() == DialogResult.OK)
                {
                    this.AtelyeId = ce.AtelyeId;
                    Reset();

                    CEs = ce.CEs;
                    txtInfo.Caption = "ÇıkışEmriId- " + CEs;
                    if ((AtelyeId == 5 || AtelyeId == 160))//Eğer çıkış yeni depodan karbele olacaksa irsaliye kesilmeyecek
                        btnIrsaliye.Caption = "İrsaliyesiz Çıkış";

                    GetDetails("xCikis1;xCikis2", "GetCikis", CEs);

                    gvCikis.BestFitColumns();
                    gvCikisLines.BestFitColumns();
                    //EnableEvenOddROw();
                }
            }
        }

        string CEs;
        void Reset()
        {
            Set_GPO_State(1, false);
            Set_GPO_State(2, false);
            Set_GPO_State(3, false);
            Set_GPO_State(4, false);

            dtTanimsiz.Clear();
            ds.xCikis1.Clear();
            ds.xCikis2.Clear();
            tags.Clear();

            CEs = string.Empty;
            txtInfo.Caption = "ÇıkışEmriId- SEÇİLMEDİ";
            tpTanımsız.Text = "Tanımsız toplar";
            btnIrsaliye.Caption = "İrsaliye Çıkar";

            DisableEvenOddROw();
        }



        void Cikis_HandleDestroyed(object sender, EventArgs e)
        {
            isHandleDestroyed = true;
        }

        void raiseSn(object sender, System.Timers.ElapsedEventArgs e)
        {
            timerSn.Enabled = false;
            if (!isHandleDestroyed)
                this.Invoke(new SnHandler(HerSn));
            timerSn.Enabled = true;
        }

        void raiseDk(object sender, System.Timers.ElapsedEventArgs e)
        {
            if (timerDk.Enabled)
            {
                timerDk.Enabled = false;
                if (!isHandleDestroyed)
                    this.Invoke(new DkHandler(HerDk));
                timerDk.Enabled = true;
            }
        }

        void HerDk()
        {
            RefreshTop();
        }

        List<int> tanimsizTagler = new List<int>();

        private void AddToCikis(int epc)
        {
            if (!ds.xCikis2.Rows.Contains(epc))
            {
                MyData.xToplarRow rr = ds.xToplar.FindByRollId(epc);
                if (rr != null)
                {
                    if (SelectedShelfId == 0 ||
                        rr.ShelfId == SelectedShelfId)
                    {
                        if (!ds.xCikis1.Rows.Contains(rr.ProductId))
                        {
                            MyData.xCikis1Row d1 = ds.xCikis1.NewxCikis1Row();
                            if (!rr.IsProductIdNull())
                                d1.ProductId = rr.ProductId;
                            if (!rr.IsStokTipiIdNull())
                                d1.StokTipiId = rr.StokTipiId;
                            ds.xCikis1.AddxCikis1Row(d1);
                        }

                        MyData.xCikis2Row dr = ds.xCikis2.NewxCikis2Row();

                        if (!rr.IsOwnerIdNull())
                            dr.OwnerId = rr.OwnerId;
                        if (!rr.IsQtyNull())
                            dr.Qty = rr.Qty;
                        if (!rr.IsShelfIdNull())
                            dr.ShelfId = rr.ShelfId;
                        if (!rr.IsBrandIdNull())
                            dr.BrandId = rr.BrandId;
                        if (!rr.IsVendorIdNull())
                            dr.VendorId = rr.VendorId;
                        if (!rr.IsCikisEmriIdNull())
                            dr.CikisEmriId = rr.CikisEmriId;
                        if (!rr.IsBolunenTopIdNull())
                            dr.BolunenTopId = rr.BolunenTopId;
                        if (!rr.IsProductIdNull())
                            dr.ProductId = rr.ProductId;
                        if (!rr.IsOrderRefNull())
                            dr.OrderRef = rr.OrderRef;

                        dr.RollId = epc;
                        ds.xCikis2.AddxCikis2Row(dr);
                    }
                }
                else if (!tanimsizTagler.Contains(epc))
                {
                    //Notify("Tanımsız top " + epc.ToString());
                    tanimsizTagler.Add(epc);
                    dtTanimsiz.Rows.Add(DateTime.Now, epc.ToString());
                    tpTanımsız.Text = "Tanımsız toplar- " + tanimsizTagler.Count;

                }
            }

            MyData.xCikis2Row c2 = ds.xCikis2.FindByRollId(epc);
            if (c2 != null)
            {
                if (c2.IsDurumNull())
                    c2.Durum = "Fazla";

                if (c2.Durum == "Eksik")
                    c2.Durum = "OK";
            }
        }

        void btnIptal_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            Reset();
        }

        bool Check()
        {
            int eksik = 0, fazla = 0;

            for (int i = 0; i < ds.xCikis2.Rows.Count; i++)
                switch (ds.xCikis2[i].Durum)
                {
                    case "Eksik": if (ds.xCikis2[i].IsIptalNull() || ds.xCikis2[i].Iptal == false) eksik++; break;
                    case "Fazla": if (ds.xCikis2[i].IsIptalNull() || ds.xCikis2[i].Iptal == false) fazla++; break;
                }

            if (eksik > 0 || fazla > 0)
            {
                return XtraMessageBox.Show("İrsaliyenin, " + (eksik > 0 ? eksik.ToString() + " eksik " : string.Empty) + (fazla > 0 ? fazla.ToString() + " fazla " : string.Empty) + "top ile kesilmesini onaylıyor musunuz?", "Confirm", MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.Yes;
            }
            return true;
        }

        void PrepareImageComboBoxEdit(GridView gv, string colName, string opts)
        {
            RepositoryItemImageComboBox imageCombo = gv.GridControl.RepositoryItems.Add("ImageComboBoxEdit") as RepositoryItemImageComboBox;
            imageCombo.Items.BeginUpdate();
            int ndx = 0;
            imageCombo.SmallImages = ErrorOk;
            foreach (string opt in opts.Split('|'))
                imageCombo.Items.Add(new ImageComboBoxItem(opt, ndx++));
            imageCombo.Items.EndUpdate();
            gv.Columns[colName].ColumnEdit = imageCombo;
        }

        int processedTagCount = 0;
        void HerSn()
        {
            if (tags.Count != processedTagCount)
            {
                #region Gridi Güncelle
                int[] currentTags = new int[tags.Count];
                tags.CopyTo(currentTags);
                foreach (int tag in currentTags)
                    AddToCikis(tag);
                gvCikis.BestFitColumns();
                #endregion

                #region Kuleyi Ayarla
                Set_GPO_State(3, ds.xCikis1.Select("E>0").Length > 0);
                Set_GPO_State(2, ds.xCikis1.Select("F>0").Length > 0);
                Set_GPO_State(1, ds.xCikis1.Select("E>0").Length +
                    ds.xCikis1.Select("F>0").Length == 0
                    && ds.xCikis1.Select("O>0").Length > 0);
                #endregion

                processedTagCount = tags.Count;
            }
        }

        public override void AddTag(int epcint, ushort AntennaId)
        {
            if (epcint < 1000 || epcint > 1e9)
                return;

            if (!tags.Contains(epcint))
                tags.Add(epcint);

        }

        private void btnConnectLLRP_ItemClick(object sender, ItemClickEventArgs e)
        {
            StartReader(AppSession.GateIP, ENUM_ImpinjInventorySearchType.Single_Target_With_Suppression, Convert.ToUInt16(biPower.EditValue));
            btnConnectLLRP.Enabled = false;
            biPower.Enabled = false;
        }
    }
}
